package com.ruoyi.common.log.sql;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.sql.PreparedStatement;
import java.sql.Statement;

@Aspect
@Component
public class JdbcSqlLogAspect {

    // 拦截 Statement 的 execute 相关方法
    @Pointcut("execution(* java.sql.Statement.execute*(..))")
    public void statementPointcut() {}

    @Around("statementPointcut()")
    public Object logJdbcSql(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取目标对象（Statement 或 PreparedStatement）
        Object target = joinPoint.getTarget();
        String sql = "";
        
        // 获取 SQL 语句
        if (target instanceof PreparedStatement) {
            // PreparedStatement 可通过 getPreparedSql 工具方法获取 SQL（需反射）
            sql = getPreparedSql((PreparedStatement) target);
        } else if (target instanceof Statement) {
            // Statement 直接执行 SQL 字符串，第一个参数即为 SQL
            Object[] args = joinPoint.getArgs();
            if (args.length > 0 && args[0] instanceof String) {
                sql = (String) args[0];
            }
        }
        
        System.out.println("JDBC SQL: " + sql);
        return joinPoint.proceed();
    }

    // 反射获取 PreparedStatement 的 SQL（不同驱动实现可能不同）
    private String getPreparedSql(PreparedStatement ps) throws Exception {
        Field field = ps.getClass().getDeclaredField("sql");
        field.setAccessible(true);
        return (String) field.get(ps);
    }
}